package org.java.base.filesAndPaths;

import java.io.IOException;
import java.nio.file.*;

/**
 * Java NIO Files类(Java . NIO .file.Files)提供了几种操作文件系统中的文件的方法。
 * Files类与java.nio.file.Path实例一起工作，因此在使用Files类之前，您需要了解Path类。
 */
public class FilesDemo {

    /**
     * Files.createDirectory()方法从Path实例创建一个新目录。下面是一个Java Files.createDirectory()示例:
     */
    public static void FilesDemo() {
        Path path = Paths.get("data/subdir");

        try {

            Path newDir = Files.createDirectory(path);
        } catch (FileAlreadyExistsException e) {
            // the directory already exists.
        } catch (IOException e) {
            //something else went wrong
            e.printStackTrace();
        }
    }

    /**
     * 首先，该示例创建源路径和目标路径实例。然后，该示例调用Files.copy()，将两个Path实例作为参数传递。
     * 这将导致源路径引用的文件被复制到目标路径引用的文件中。如果目标文件已经存在，
     * 则抛出java.nio.file.FileAlreadyExistsException异常。如果出现其他错误，将抛出IOException。
     * 例如，如果要复制文件的目录不存在，将抛出IOException。
     */
    public static void filesCopy() {
        Path sourcePath = Paths.get("data/logging.properties");
        Path destinationPath = Paths.get("data/logging-copy.properties");

        try {
            Files.copy(sourcePath, destinationPath);
        } catch (FileAlreadyExistsException e) {
            //destination file already exists
        } catch (IOException e) {
            //something else went wrong
            e.printStackTrace();
        }
    }

    /**
     * ：可以强制Files.copy()覆盖现有文件。下面的例子展示了如何使用Files.copy()覆盖现有文件:
     */
    public static void forceCopy() {
        Path sourcePath = Paths.get("data/logging.properties");
        Path destinationPath = Paths.get("data/logging-copy.properties");

        try {
            Files.copy(sourcePath, destinationPath,
                StandardCopyOption.REPLACE_EXISTING);
        } catch (FileAlreadyExistsException e) {
            //destination file already exists
        } catch (IOException e) {
            //something else went wrong
            e.printStackTrace();
        }
    }

    /**
     * Java NIO Files类还包含一个用于将文件从一个路径移动到另一个路径的函数。移动文件与重命名文件相同，
     * 只是移动文件可以将其移动到不同的目录，并在相同的操作中更改其名称。是的，java.io.File类也可以通过它的renameTo()方法来实现这一点，
     * 但是现在在java.io.File . files类中也有了文件移动功能。
     * 下面是一个Java Files.move()示例:
     */
    public void filesMoves() {
        Path sourcePath = Paths.get("data/logging-copy.properties");
        Path destinationPath = Paths.get("data/subdir/logging-moved.properties");

        try {
            Files.move(sourcePath, destinationPath,
                StandardCopyOption.REPLACE_EXISTING);
        } catch (IOException e) {
            //moving file failed.
            e.printStackTrace();
        }
    }

    /**
     * 方法的作用是:删除文件或目录。下面是一个Java Files.delete()示例:
     */
    public void fileRemove() {
        Path path = Paths.get("data/subdir/logging-moved.properties");

        try {
            Files.delete(path);
        } catch (IOException e) {
            //deleting file failed
            e.printStackTrace();
        }
    }

}
